package com.manning.readinglist;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.actuate.trace.Trace;
import org.springframework.boot.actuate.trace.TraceRepository;
import org.springframework.data.mongodb.core.MongoOperations;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.List;
import java.util.Map;

@Service
public class MongoTraceRepository implements TraceRepository {

    /**
     * 为了使用 MongoTraceRepository，我们需要保证 Spring 应用程序上下文里先有一个 MongoOperations Bean。得益于 Spring Boot 的起步依赖和自动配置，做到这一点只需添加
     * MongoDB 起步依赖即可。(spring-boot-starter-data-mongodb) 添加了这个起步依赖后，Spring Data MongoDB 和所依赖的库会添加到应用程序的 Classpath里。Spring Boot
     * 会自动配置所需的 Bean，以便使用 MongoDB 数据库。这些 Bean 里就包括 MongoOperations。
     */
    private MongoOperations mongoOps;

    @Autowired
    public MongoTraceRepository(MongoOperations mongoOps) { // 注入 MongoOperations
        this.mongoOps = mongoOps;
    }

    /**
     * findAll() 方法很直白，用注入的 MongoOperations 来查找全部 Trace 对象。
     * @return
     */
    @Override
    public List<Trace> findAll() {
        // 获取所有跟踪条目
        return mongoOps.findAll(Trace.class);
    }

    /**
     * add() 方法稍微有趣一点，用当前时间和含有跟踪信息的 Map 创建了一个 Trace 对象，然后通过 MongoOperations.save() 将其保存下来。
     * @param map
     */
    @Override
    public void add(Map<String, Object> map) {
        // 保存一个跟踪条目
        mongoOps.save(new Trace(new Date(), map));
    }
}
